# -*- coding: utf-8 -*-
# @File  : with管理进程锁.py
# @Author: zbh
# @Date  : 2025/2/24_16:02


'''如果进程锁获取后不释放，后续需要获取该锁的进程会在尝试获取锁时被阻塞，无法执行受该锁保护的关键代码段，
但进程本身可以继续执行其他不受该锁影响的代码。为了避免死锁和资源浪费，在使用进程锁时，
一定要确保在适当的时候调用 lock.release() 方法释放锁。
可以使用 with 语句来自动管理锁的获取和释放，这样可以避免手动释放锁时可能出现的错误
在 with 语句块结束时，锁会自动被释放。
'''


import multiprocessing
import time

def worker(lock):
    print(f"Process {multiprocessing.current_process().name} is trying to acquire the lock.")
    with lock:
        print(f"Process {multiprocessing.current_process().name} has acquired the lock.")
        time.sleep(2)
    print(f"Process {multiprocessing.current_process().name} has released the lock.")

if __name__ == "__main__":
    lock = multiprocessing.Lock()
    p1 = multiprocessing.Process(target=worker, args=(lock,))
    p2 = multiprocessing.Process(target=worker, args=(lock,))

    p1.start()
    p2.start()

    p1.join()
    p2.join()